import re

def find_one_month_data_in_a_station(station_dataset:list, year, month):
    '''
    在某个站找到 某个年月的数据
    :param station_dataset: 某个站点的所有数据集
    :param year: 年
    :param month: 月
    :return: row data / None   ； 一行数据 or ，如果找不到返回 None
    '''
    for row_data in station_dataset:
        #每行数据索引1、2为年月
        if year==row_data[1] and month==row_data[2]:
            return row_data

    return None

def find_one_month_data_in_all_station(dataset:list, year, month):
    '''
    查询同时期，各个站点同时期的所有数据
    :param dataset: 整个数据集，数组第二层按照站点分好
    :param year:
    :param month:
    :return: array 各个站点同时期的所有数据
    '''
    print( '%s-%s 各个站点的数据：' %(str(year), str(month),) )
    filted_datas = [] #各个站点同时期的所有数据
    for station in dataset:
        row_data = find_one_month_data_in_a_station(station,year,month)
        if row_data is not None:
            filted_datas.append(row_data)
            # print(row_data)  # 详细信息 ，打印全部数据
    return filted_datas

def data_filter(data):
    """
    数据过滤规则

    999998 所有要素 不观测和无数据
    999990 所有要素 微量
    999999 所有要素 缺测
    9996xx.x 降水量 雪(雨夹雪，雪暴）
    9997xx.x 降水量 雨和雪
    9998xx.x 降水量 雾露霜
    999xxx 相对湿度 最小相对湿度取自定时值
    998xxx.x 风速 风速大于等于 xxx.x m/s
    999997 风向 风向为可变、所有方向、不明、波浪混乱、方向未定
    999xxx 风向 xxx 表示按 16 方位或 8 方位记录的风向方位
    99998x 风向 x 表示风向出现个数，当 x=9 时，表示风向出现个数
    大于等于 9 次

    :param data:
    :return:
    """
    try:
        if int(float(data)) == 999998 or int(float(data)) == 999999:
            return 'NaN'
        elif int(float(data)) == 999990:
            return '1'
        elif re.match('9996', str(data)) or re.match('9997', str(data)) or re.match('9998', str(data)):
            return str(data)[4:]
        else:
            # 其余的情况用不到，不考虑
            return str(data)
    except:
        return str(data)

def avg_completion_data(dataset:list, year, month, index, value_type = 'float', strategy='mean',fill_value=None):
    '''
    用同时期各个站点的平均值，补充数据
    :param dataset: 整个数据集
    :param year:
    :param month:
    :param index: 需要补充的数据的索引, 仅认为char值为999999或999999.0000为缺测数据
    :param strategy:  #先完成 'mean'的编写
        strategy : string, default='mean'
        The imputation strategy.
        - If "mean", then replace missing values using the mean along
          each column. Can only be used with numeric data.
        - If "median", then replace missing values using the median along
          each column. Can only be used with numeric data.
        - If "most_frequent", then replace missing using the most frequent
          value along each column. Can be used with strings or numeric data.
        - If "constant", then replace missing values with fill_value. Can be
          used with strings or numeric data.
    :return: float/None  ； 应补充的数据值(目前为float，需要别的再加)/  如果所有站点都缺测 或 该时期所有站点都没数据 则返回None
    '''
    month_data_in_stations = find_one_month_data_in_all_station(dataset, year, month)
    if len(month_data_in_stations) == 0:
        return None

    available_num = 0 # 有效数据的数量
    data_values = 0
    # 数据计算格式
    if value_type == 'float':  #目前仅为float，需要别的再加
        data_values = 0.0

    for row_data in month_data_in_stations:
        print(row_data[index] + ' ', end='')   # 打印各个站点该index数据
        if data_filter(row_data[index]) != 'NaN':
            # 非缺测数据：
            available_num += 1
            data_values += float( data_filter(row_data[index]) )
    print()#换行

    #数据处理
    if available_num == 0:
        #所有站点数据无效
        print( '%s-%s, index:%s，  补全失败，同时期所有站点数据无效'  %(str(year), str(month), str(index),))
        return None
    if strategy == 'mean':
        return data_values / available_num

'''
function avg_completion_data  test:

dataset = [
    [['132','1951','1','1615'],['132','1951','2','47'],['132','1951','3','77'],['132','1951','4','77']],
    [['46546','1951','1','45'],['46546','1951','2','999999'],['46546','1951','3','44'],['46546','1951','4','44']],
    [['5214','1951','1','1615'],['5214','1951','2','40'],['5214','1951','3','44'],['5214','1951','4','44']],
    [['7146','1951','1','1615'],['7146','1951','2','45'],['7146','1951','3','111'],['7146','1951','4','1615']],
]

In[23]: avg_completion_data(dataset, '1951', '2', 3)
1951/2各个站点的数据：
['132', '1951', '2', '47']
['46546', '1951', '2', '999999']
['5214', '1951', '2', '40']
['7146', '1951', '2', '45']
Out[23]: 44.0

'''








#
# # 数据提取
# raw_date = []
# raw_Temperature = []
# for row in file_data:
#     year_month = row[1]+'-'+row[2]
#     raw_date.append(year_month)
#     raw_Temperature.append(row[12])
#
#
# #数据类型转换
# int_Temperature = []
# for str_t in raw_Temperature:
#     temp = int(float(str_t))
#     if temp > 60:
#         temp = 30
#     int_Temperature.append(temp)
#
# dates = []
# for str_date in raw_date:
#     temp = datetime.strptime(str_date, '%Y-%m')
#     dates.append(temp)
#
#
#
# from matplotlib import pyplot as plt
# import matplotlib.dates as mdates
#
#
#
# fig = plt.figure(figsize=(10,6))
# ax1 = fig.add_subplot(111)
# ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
# ax1.plot(dates, int_Temperature, c='red')
# fig.autofmt_xdate()
# ax1.set_title("month average Temperature in GanSu Prov", fontsize=14)
# ax1.set_ylabel("Temperature (℃)")
# ax1.tick_params(direction='in')
# plt.show()